package com.rybbaby.tss.core.verifier;

import com.rybbaby.tss.core.annotation.validator.StringValidator.StringCaseType;

/**
 * @description 字符串验证器
 * 
 * @author 谢进伟
 * 
 * @createDate 2016年3月31日 下午11:19:49
 */
public class StringVerifier extends AbstractVerifier {
	
	/**
	 * 是否为纯英文
	 */
	private boolean pureEnlish;
	
	/**
	 * 是否为纯中文
	 */
	private boolean pureChinese;
	/**
	 * 是否为纯数字
	 * 
	 * @return
	 */
	private boolean puredigit = false;
	
	/**
	 * 大小写
	 * 
	 * @return
	 */
	private StringCaseType caseType = StringCaseType.UPPERCASEORLOWERCASE;
	
	/**
	 * 字符串长度
	 * 
	 * @return
	 */
	private int length = Integer.MAX_VALUE;
	
	/**
	 * 是否允许为空值
	 * 
	 * @return
	 */
	private boolean nullable = true;
	
	/**
	 * 是否为纯英文
	 * 
	 * @return 是否为纯英文
	 */
	public boolean isPureEnlish() {
		return this.pureEnlish;
	}
	
	/**
	 * 设置是否为纯英文
	 * 
	 * @param pureEnlish
	 *            是否为纯英文
	 */
	public void setPureEnlish(boolean pureEnlish) {
		this.pureEnlish = pureEnlish;
	}
	
	/**
	 * 是否为纯中文
	 * 
	 * @return 是否为纯中文
	 */
	public boolean isPureChinese() {
		return this.pureChinese;
	}
	
	/**
	 * 设置是否为纯中文
	 * 
	 * @param pureChinese
	 *            是否为纯中文
	 */
	public void setPureChinese(boolean pureChinese) {
		this.pureChinese = pureChinese;
	}
	
	/**
	 * 是否为存数字
	 * 
	 * @return 是否为存数字
	 */
	public boolean isPuredigit() {
		return this.puredigit;
	}
	
	/**
	 * 设置是否为存数字
	 * 
	 * @param puredigit
	 *            是否为纯数字
	 */
	public void setPuredigit(boolean puredigit) {
		this.puredigit = puredigit;
	}
	
	/**
	 * 获取大小写类型
	 * 
	 * @return 大小写类型
	 */
	public StringCaseType getCaseType() {
		return this.caseType;
	}
	
	/**
	 * 设置大小写类型
	 * 
	 * @param caseType
	 *            大小写类型
	 */
	public void setCaseType(StringCaseType caseType) {
		this.caseType = caseType;
	}
	
	/**
	 * 获取最大长度
	 * 
	 * @return 最大长度
	 */
	public int getLength() {
		return this.length;
	}
	
	/**
	 * 设置最大长度
	 * 
	 * @param length
	 *            最大长度
	 */
	public void setLength(int length) {
		this.length = length;
	}
	
	/**
	 * 获取 是否允许为空值
	 * 
	 * @return 是否允许为空值
	 */
	public boolean isNullable() {
		return this.nullable;
	}
	
	/**
	 * 设置 是否允许为空值
	 * 
	 * @param nullable
	 *            是否允许为空值
	 */
	public void setNullable(boolean nullable) {
		this.nullable = nullable;
	}
	
	@Override
	public boolean validate(Object params) {
		return validate(params , nullable , null , new ValidationRule() {
			
			@Override
			public boolean check(Object params) {
				String value = params + "";
				return checkPureEnlish(value) && checkPureChinese(value) && checkLength(value) && checkCaseType(value) && checkPuredigit(value);
			}
		});
	}
	
	/**
	 * 验证长度
	 * 
	 * @param value
	 *            需要验证的值
	 * @return
	 */
	private boolean checkLength(String value) {
		return value.length() <= length;
	}
	
	/**
	 * 验证大小写类型
	 * 
	 * @param value
	 *            需要验证的值
	 * @return
	 */
	private boolean checkCaseType(String value) {
		if(caseType == StringCaseType.LOWERCASE) {
			return value.equals(value.toLowerCase());
		} else if(caseType == StringCaseType.UPPERCASE) {
			return value.equals(value.toUpperCase());
		} else {
			return true;
		}
	}
	
	/**
	 * 验证是否为纯英文
	 * 
	 * @param value
	 *            需要验证的值
	 * @return
	 */
	private boolean checkPureEnlish(String value) {
		return pureEnlish ? value.matches("^[a-zA-Z]+$") : true;
	}
	
	/**
	 * 验证是否为纯中文
	 * 
	 * @param value
	 *            需要验证的值
	 * @return
	 */
	private boolean checkPureChinese(String value) {
		return pureChinese ? value.matches("^[\u4e00-\u9fa5]+$") : true;
	}
	
	/**
	 * 验证是否为纯数字
	 * 
	 * @param value
	 *            需要验证的值
	 * @return
	 */
	private boolean checkPuredigit(String value) {
		return puredigit ? value.matches("^\\d+$") : true;
	}
}
